import { request } from "../../request/index";
import { rejeneratorRuntime } from "../../utils/asyncWx";
import {login,requestPayment} from '../../utils/asyncWx'; 
Page({
    data:{
        // 接收本地存储中的地址信息
        address:{},
        // 收藏到本地存储的商品数据
        cart:[],
        // 全选
        allChecked:false,
        // 总数量
        totalNum:0,
        // 总价格
        totalPrice:0,
        // 控制是否展示选择付款
        isShowPayment:false,
        // 控制中单选框
        isRadio:true,
        // 存储选择的支付形式
        payStatus:'onLine',
        // 线下付款二维码模态框
        isCloseSpread: false,
        // 存储用户token
        token: '',
        // 存储付款信息
        pay:'',
        // 存储订单编号
        order_number:''
    },
    onShow(){
        // 获取收货地址
        const address = wx.getStorageSync('address');
        // 获取缓存中的购物车数据
        const cart = wx.getStorageSync('cart') || []
        // 计算是否该全选(every会循环判断数组当数组中数据都为true才会返回true)
        // const allChecked = cart.length ? cart.every(v => v.checked) : false; 
        // 获取用户信息地址
        const token = wx.getStorageSync('token');
        this.setData({
          address,
          token
        });
        // 修改状态则调用方法重新计算
        this.setCartChecked(cart);
    },
    // 获取收货地址
    getAddress(){
        wx.chooseAddress({
          success: (result) => {
            // 把获取到的地址存到本地存储中
            wx.setStorageSync('address', result)   
              wx.showToast({
                title: '地址绑定成功~',
              })
          },
          fail:() => {
            wx.showToast({
              title: '拒绝了授权地址',
              icon:'error'
            })
          }
        })
    },
    // 当商品复选框发生变化执行
    handeItemChange(e){
      // 复选框变化的商品id
      const goods_id = e.currentTarget.dataset.id;
      // 获取data中的cart商品
      let {cart} = this.data;
      // 查找被修改的商品
      let index = cart.findIndex(v => v.goods_id === goods_id);
      // 把找到的对应商品值取反
      cart[index].checked = !cart[index].checked;
      // 重新计算
      this.setCartChecked(cart);
    },
    // 点击加减修改商品数量的方法 
    handeItemEdit(e){
      // 解构出传递过来的参数
      const {id,operation} = e.currentTarget.dataset;
      // 获取商品数组
      let {cart} = this.data;
      // 找到需要修改的商品
      const index = cart.findIndex(v => v.goods_id === id);
      if(cart[index].num === 1 && operation === -1){
        wx.showModal({
          title:'提示',
          content:'亲~确定要删除该宝贝吗?',
          success: (result) => {
            if(result.confirm) {
              cart.splice(index,1)
              // 把值设置回去
              this.setData({
                cart
              });
              // 把修改后的数量存入缓存中
              wx.setStorageSync('cart', cart);
              // 重新计算
              this.setCartChecked(cart);
            }
          }
        })
      }else{
        // 修改找到的商品数量
        cart[index].num += operation;
        // 把值设置回去
        this.setData({
          cart
        })
        // 把修改后的数量存入缓存中
        wx.setStorageSync('cart', cart);
        // 重新计算
        this.setCartChecked(cart);
      }
    },
    // 修改商品状态时修改工具栏数据
    setCartChecked(cart){
      // 状态
      let allChecked = true;
      // 总数量 & 总价格
      let totalNum = 0;
      let totalPrice = 0;
      // 循环心仪商品
      cart.forEach(v => {
        // 判断商品是否选中选中则加数量和价格
        if(v.checked) {
          totalPrice += v.num * v.goods_price;
          totalNum += v.num;
        }
        // 当存在未选中的全选按钮则不全选
        else allChecked = false
      });
      // 判空改变状态(因为为空的话是个数组而数组默认是true)
      allChecked = cart.length != 0 ? allChecked : false;
      // 把值设置回去
      this.setData({
        cart,
        totalNum,
        totalPrice,
        allChecked        
      });
      // 把缓存中的数据也修改一下
      wx.setStorageSync('cart', cart);
    },
    // 全选/反选 
    handeAllChecked(){
      // 获取商品状态
      let {cart,allChecked} = this.data;
      // 全选按钮取反
      allChecked = !allChecked
      // 循环出商品状态
      cart.forEach(v => v.checked = allChecked);
      // 设置回data中
      this.setData({cart});
      wx.setStorageSync('cart', cart);
      // 修改状态则调用方法重新计算
      this.setCartChecked(cart);
    },
    // 点击付款执行的事件
    async handePay(){
      // 拿到地址 and 商品数量判断是否可以结算
      const {address,totalNum} = this.data;
      // 判断是否小于1 and 获没获取收货地址
      if(!address.userName) return wx.showToast({
        title: '先填写收货地址',
      })
      if(!totalNum) return wx.showToast({
        title: '最少要买一件~',
      });
      // 获取用户token
      const token = wx.getStorageSync('token');
      // 判断用户是否存在token
      if(!token) return wx.showToast({title: '请先获取信息~',icon:'error'})
      // 创建订单的请求体参数
      const order_price = this.data.totalPrice;
      const consignee_addr = this.data.address.provinceName + this.data.address.cityName + this.data.address.countyName + this.data.address.detailInfo;
      // goods字段
      const cart = this.data.cart;
      let goods = [];
      cart.forEach(v => goods.push({
        goods_id:v.goods_id,
        goods_number:v.num,
        goods_price:v.goods_price
      }));
      // 整合请求参数
      const orderParams = {order_price,consignee_addr,goods};
      // 发送请求获取订单编号
      const {order_number} = await request({url:'my/orders/create',method:'post',
      data:orderParams});
      // 保存请求过过来的订单编号以及请求头(token)
      this.setData({
        order_number
      })
      // 准备发起预支付的订单
      const {pay} = await request({url:'my/orders/req_unifiedorder',method:'post',data:{order_number}});
      // 展示选择支付方式(并把下单支付信息传过去供外界使用)
      this.setData({
        pay,
        isShowPayment:!this.data.isShowPayment
      })
    },
    // 获取用户信息
    async handleGetUserInfo(e){
      /* const {encryptedData,iv,rawData,signature} = e.detail;
      // 获取小程序登录成功后的code
      const {code} = await login();
      // 请求时需要的参数
      const loginParams = {encryptedData,iv,rawData,signature,code}
      // 发送请求获取用户token
      const {token} = await request({url:'users/wxlogin',data:loginParams,method:'post'}); 
      // 把获取到的token存到本地(个人账户是获取不到的会是null)
      wx.setStorageSync('token',token) */
      // 假
      this.setData({
        token:'false'
      })
      wx.setStorageSync('token','Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjIzLCJpYXQiOjE1NjQ3MzAwNzksImV4cCI6MTAwMTU2NDczMDA3OH0.YPt-XeLnjV-_1ITaXGY2FhxmCe4NvXuRnRB8OMCfnPo')
    },
    // 关闭选择付款方式 
    closePay(){
      // 关闭对话框
      this.setData({
        isShowPayment:!this.data.isShowPayment
      });
      // 提示订单已关闭
      wx.showToast({
        title: '订单以关闭~',
      })
    },
    // 关闭付款
    closeSpread() {
      this.setData({
        isCloseSpread : !this.data.isCloseSpread
      });
    },
    // 支付方式切换
    handeRadio(e){
      if(e.detail.value === 'offLine'){
        wx.showModal({
          title:'温馨提示',
          cancelText:'线下支付',
          confirmText:'线上支付',
          content:'亲，建议选择线上付费呢~',
          success: (res) => {
            // 不管选择线上还是线下都应该关闭支付直接走逻辑
            if (res.confirm) {
              // 调用线上付款
              this.onLinePay();
            } else {
              // 线下支付
              this.setData({
                isShowPayment:!this.data.isShowPayment,
                isCloseSpread : !this.data.isCloseSpread
              })
            }
          }
        })
      }
      this.setData({
        isRadio:!this.data.isRadio,
        // 把改变的状态重新放进去保存
        payStatus:e.detail.value
      });
    },
    // 付款操作
    Pay(){
      this.setData({
        isShowPayment:!this.data.isShowPayment
      })
      if(this.data.payStatus !== 'offLine'){
        // 调用线上付款
        this.onLinePay();
      }else{
        // 线下付款
        this.setData({
          isCloseSpread : !this.data.isCloseSpread
        })
      }
    },
    async onLinePay(){
      try {
        // 线上付款
        await requestPayment(this.data.pay);
        // 查询订单支付状态
        await request({url:'my/orders/chkOrder',method:'post',data:{order_number}});
        // 提示
        wx.showToast({
          title: '支付成功~',
        })
        // 支付成功后删除购物车中对应商品
        let newCart = wx.getStorageSync('cart');
        // 已经被选中的则代表刚刚支付掉了
        newCart = newCart.filter(v => !v.checked);
        // 重新填充回本地中
        wx.setStorageSync('cart', newCart)
      } catch (error) {
        wx.showToast({
          title: '支付失败!',
          icon:'error'
        })
      }
    },
    // 长按分享支付二维码
    previewImage(e) {
      var current = e.target.dataset.src;
      wx.previewImage({
        current,
        urls: [current]
      })
    },
    // 刷新事件
    onPullDownRefresh(){
      // 假刷新
      setTimeout(() => {  
        wx.stopPullDownRefresh();
      }, 1500);
    }
})